package com.katze.boot.applet.ssh.service;

import com.katze.boot.applet.ssh.entity.SshProcessEntity;
import com.katze.boot.applet.ssh.entity.SshSessionEntity;
import com.katze.ssh.SshSessionKey;
import com.katze.ssh.cmd.ShellChannel;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface SecureShellService {

    /**
     * 获取会话连接配置
     * @param sessionId 会话ID
     */
    SshSessionKey getSessionProperties(String sessionId);

    /**
     * 获取所有会话信息
     * @param entity 查询条件
     */
    List<SshSessionEntity> findSessions(SshSessionEntity entity);

    /**
     * 获取会话信息
     * @param id 会话ID
     * @return
     */
    SshSessionEntity findSessionById(Serializable id);

    /**
     * 根据会话获取进程信息
     * @param sessionId 会话ID
     */
    List<SshProcessEntity> findProcessBySession(String sessionId) throws Exception;

    /**
     * 进程标识模糊匹配
     * @param owner 会话所有者
     * @param name 进程标识
     */
    Collection<String> findProcessName(String owner, String name);

    /**
     * 新增/更新会话信息
     * @param entity 会话信息
     */
    boolean saveOrUpdate(SshSessionEntity entity);

    /**
     * 新增/更新进程信息
     * @param entity 进程信息
     */
    boolean saveOrUpdate(SshProcessEntity entity);

    /**
     * 删除会话
     * @param id 会话ID
     */
    boolean deleteSessionById(Serializable id);

    /**
     * 删除进程
     * @param id 进程ID
     */
    boolean deleteProcessById(Serializable id);

    /**
     * 执行启动/关闭命令
     *
     * @param cmd      指令
     * @param sessionId 会话ID
     * @param processes 进程ID
     */
    List<Map<String, String>> execute(String cmd, String sessionId, String[] processes) throws Exception;

    /**
     * 创建Shell控制台
     *
     * @param sessionId 会话ID
     * @return
     */
    ShellChannel createShell(String sessionId) throws Exception;

    /**
     * 关闭会话
     * @param sessionId 会话ID
     */
    void exit(String sessionId);
}
